import { getUserInfoAPI, loginAPI } from '@/api/user'
import { constantRoutes, resetRouter } from '@/router'
import { setToken, getToken, removeToken } from '@/utils/auth'
// 状态
const state = {
  token: getToken(),
  // 用户基本信息
  routes: constantRoutes,
  userInfo: {}
}

// 同步任务: 存储token到state
const mutations = {
  setRoutes(state, asyncRoutes) {
    state.routes = [...constantRoutes, ...asyncRoutes]
  },
  removeUserToken(state) {
    state.token = null
    // 清除本地token
    removeToken()
  },
  /**
   * 存储token到state
   * @param {*} state 状态对象
   * @param {string} token 用户token
   */
  setUserToken(state, token) {
    state.token = token
    // 将token存储到本地
    setToken(token)
  },
  /**
   * 获取用户基本信息
   * @param {*} state 状态对象
   * @param {*} userInfo 用户基本信息
   */
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo
  }
}

// 异步任务: 发送登录请求 得到token
const actions = {
  /**
   * 清除登录痕迹
   */
  logoutAction(context) {
    // 清除token
    context.commit('removeUserToken')
    // 清除userInfo
    context.commit('setUserInfo', {})
    // 重置路由
    resetRouter()
  },
  /**
   * 获取用户基本信息
   * @param {*} context
   */
  async getUserInfoAction(context) {
    // console.log('获取用户基本信息')
    // 调接口 获取用户基本信息
    const userInfo = await getUserInfoAPI()
    context.commit('setUserInfo', userInfo)
    return userInfo
  },
  /**
   * 用户登录action
   * @param {*} context 上下文 提交mutation
   * @param {object} loginForm 额外参数 登录表单数据
   */
  async loginAction(context, loginForm) {
    // 发送登录请求 得到token
    const token = await loginAPI(loginForm)
    // console.log(token)
    // console.log(loginForm, token)
    context.commit('setUserToken', token)
  }
}

export default {
  // 注意点：vuex在分模块时命名空间属性时必需的
  namespaced: true,
  state,
  mutations,
  actions
}
